package runze.util.base;

import java.util.List;
/**
 * Dao接口模板
 * @author wrzhxy@qq.com
 * @创建时间 2017年2月15日 上午11:15:29
 */
public interface IDao<T> {
    /**
     * 增
     * @param   t 要增加的实体
     * @return  数据库实体主键id 自增长版
     */
	long add(T t);
    /**
     * 增
     * @param   t 要增加的实体
     * @return  数据库实体主键id uuid版
     */
	String add_uuid(T t);

    /**
     * 删 自增长版
     * @param id 主键自增长id
     */
	void del(long id);
    /**
     * 删 uuid版
     * @param id 主键uuid
     */
    void del(String id);
    /**
     * 更新
     * @param t 更新实体
     */
	void update(T t);

    /**
     * 获取单个实体 自增长
     * @param id 自增长
     * @return 单个实体
     */
	T get(long id);
    /**
     * 获取单个实体 uuid
     * @param id uuid
     * @return 单个实体
     */
	T get(String id);

    /**
     * 按条件获取单个实体
     * @param sql       sql语句
     * @param params    sql参数
     * @return          单个实体
     */
	T get(String sql, Object...params);
    /**
     * 对外暴露find方法作为所有查找方法的接口
     * 底层封装find和findByPage
     */
    /**
     * 获取所有实体
     * @return 所有实体的集合
     */
	List<T> find();
    /**
     * 按语句获取所有实体（不分页）
     * @param sql		sql语句
     * @param params	语句中的参数
     * @return			按条件获取到的实体的集合
     */
	List<T> find(String sql, Object...params);
    /**
     * 按分页获取实体
     *
     * 通过Page类的PageNo, PageSize获取实体集合
     * @param   query
     * @return  实体的集合
     */
    List<T> find(Query query);

    /**
     * 按分页获取实体
     *
     * @param pageNo
     * @param pageSize
     * @return
     */
    List<T> find(int pageNo, int pageSize);
    /**
     * 按分页获取实体 通过无参数语句筛选
     * @param query
     * @param sql       sql语句
     * @return          实体集合
     */
    List<T> find(Query query, String sql);

    /**
     * 按分页获取实体 通过无参数语句筛选
     * @param pageNo
     * @param pageSize
     * @param sql
     * @return
     */
    List<T> find(int pageNo, int pageSize, String sql);
    /**
     * 按分页获取实体 通过有参数语句筛选
     * @param query
     * @param sql       sql语句
     * @param params    sql参数
     * @return          实体集合
     */
    List<T> find(Query query, String sql, Object...params);
    /**
     * 按分页获取实体 通过有参数语句筛选
     * @param pageNo
     * @param pageSize
     * @param sql
     * @param params
     * @return
     */
    List<T> find(int pageNo, int pageSize, String sql, Object...params);
    /**
     * 数据量
     * @return
     */
	long getTotal();
	long getTotal(String sql);
	long getTotal(String sql, Object...params);
	long getTotal(Query query);
}
